/*
 * @Author: SimonCK666 SimonYang223@163.com
 * @Date: 2022-05-08 19:48:34
 * @LastEditors: SimonCK666 SimonYang223@163.com
 * @LastEditTime: 2022-05-08 19:57:01
 * @FilePath: /golang-concept/L8_pointer/pointer.go
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
package main

// golang 指针
// go 中的函数传参都是值拷贝，当然我们想要修改某个变量的时候，我们可以创建一个指向该变量的指针变量
// 传递数据使用指针，无需拷贝数据
// 类型指针不能进行偏移和运算
// go 中的指针操作非常简单，只需要记住两个符号：&(取地址) 和 *(根据地址取值)

// 指针地址和指针类型
// 每个变量在运行时都拥有一个地址，这个地址代表变量在内存中的位置。go 语言中使用 & 字符放在变量
// 前面对变量进行取地址操作。 go 语言中的值类型 int float bool string array struct 都有对应的
// 指针类型，如：*int, *int64, *string

// 指针语法
// 一个指针变量指向了一个值的内存地址。也就是我们声明了一个指针之后，可以像变量赋值一样，把一个
// 值的内存地址放入到指针当中。
// 类似于变量和常量，在使用指针前你需要声明指针。

import "fmt"

func main() {
	var ip *int
	fmt.Printf("ip: %v\n", ip)	// nil
	fmt.Printf("ip type: %T\n", ip)

	var i int = 100
	ip = &i
	fmt.Printf("ip address: %v\n", ip)	// nil
	fmt.Printf("ip: %v\n", *ip)	// nil
}